package main

import "fmt"

// 在c++中，实现接口的时候，使用纯虚函数代替接口
// 在go语言中，有专门的关键字interface来代替接口
// interface 不仅仅是用于处理多态，它可以接收任意的数据类型，有点类似void

func main() {
	//定义三个接口类型
	var i, j, k interface{}
	nams := []string{"cc", "Mrs"}
	i = nams
	fmt.Println("i= ", i)

	age := 20
	j = age
	fmt.Println("j= ", j)

	str := "hello"
	k = str
	fmt.Println("k= ", k)

	//判断K的类型
	kvalue, ok := k.(int)
	if !ok {
		fmt.Println("k不是int")
	} else {
		fmt.Println("k是int， 值为： ", kvalue)
	}

	//最常用的场景，把interface当成一个函数的参数（类似于print），使用switch来判断用户输入的不同类型
	//根据不同类型，做相应处理

	//创建一个具体三个接口类型的切片
	array := make([]interface{}, 3)
	array[0] = 1
	array[1] = "hello"
	array[2] = true
	/*
		for _, value := range array {
			//可以获取当前接口的真正数据类型
			switch value.(type) {
			case int:
				fmt.Printf("当前类型为int，内容为%d\n", value)
			case string:
				fmt.Printf("当前类型为string,内容为%s\n", value)
			case bool:
				fmt.Printf("当前类型为bool, 内容为%v\n", value) //%v可以自动推导出类型
			default:
				fmt.Printf("未知类型")
			}

		}
	*/

	//与上面一样
	for _, value := range array {
		switch v := value.(type) {
		case int:
			fmt.Printf("当前类型为int，内容为%d\n", v)
		case string:
			fmt.Printf("当前类型为string,内容为%s\n", v)
		case bool:
			fmt.Printf("当前类型为bool, 内容为%v\n", v) //%v可以自动推导出类型
		default:
			fmt.Printf("未知类型")

		}
	}
}
